package examples;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.FutureTask;

/**
 * 例子思路：
 * 创建FutureTask，线程调用sleep()
 * futureTask.get()会一直等待5s钟后返回结果
 * 
 * 
 * 1、创建FutureTask，其中构造参数是一个Callable接口
 * 2、get方法，返回执行结果，如果没有执行完则一直等待
 * 
 * 适用场景：
 * 我们的算法中有一个很耗时的操作，在编程的是，我们希望将它独立成一个模块，
 * 调用的时候当做它是立刻返回的，并且可以随时取消的
 * 
 * @author yecheng
 *
 */

public class FutureTaskDemo1 {

	public static void main(String[] args) {
		ExecutorService exec = Executors.newCachedThreadPool();

		FutureTask<String> task = new FutureTask<String>(
				new Callable<String>() {
					@Override
					public String call() throws Exception {
						Thread.currentThread().sleep(5000);
						return Thread.currentThread().getName();// 返回结果
					}
				});

		try {
			exec.execute(task);// FutureTask已经实现了Runnable接口
			String result = task.get();//获取结果，如果暂时没有则一直等待
			System.out.printf("get:%s%n", result);
		} catch (InterruptedException e) {
			e.printStackTrace();
		} catch (ExecutionException e) {
			e.printStackTrace();
		}finally{
			exec.shutdown();
		}
	}

}
